@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

echo ========================================
echo PostgreSQL 部署问题诊断工具
echo ========================================
echo.

echo [INFO] 开始诊断PostgreSQL部署问题...
echo.

:: 检查Docker环境
echo [1] 检查Docker环境
echo ----------------------------------------
docker --version
if errorlevel 1 (
    echo [ERROR] Docker 未安装或未启动
    echo [解决方案] 请确保Docker Desktop已安装并正在运行
    goto :error_exit
) else (
    echo [SUCCESS] Docker 已安装
)

docker-compose --version
if errorlevel 1 (
    echo [ERROR] Docker Compose 未安装
    echo [解决方案] 请安装最新版本的Docker Desktop
    goto :error_exit
) else (
    echo [SUCCESS] Docker Compose 已安装
)

echo.

:: 检查Docker服务状态
echo [2] 检查Docker服务状态
echo ----------------------------------------
docker info >nul 2>&1
if errorlevel 1 (
    echo [ERROR] Docker 服务未运行
    echo [解决方案] 请启动Docker Desktop
    goto :error_exit
) else (
    echo [SUCCESS] Docker 服务正在运行
)

echo.

:: 检查端口占用
echo [3] 检查端口占用情况
echo ----------------------------------------
netstat -ano | findstr :5432
if not errorlevel 1 (
    echo [WARNING] 端口 5432 已被占用
    echo [解决方案] 请停止其他PostgreSQL服务或修改端口配置
    echo [当前占用情况:]
    netstat -ano | findstr :5432
    echo.
) else (
    echo [SUCCESS] 端口 5432 未被占用
)

netstat -ano | findstr :8080
if not errorlevel 1 (
    echo [WARNING] 端口 8080 已被占用 (pgAdmin)
    echo [解决方案] 请停止其他服务或修改docker-compose.yml中的端口配置
    echo [当前占用情况:]
    netstat -ano | findstr :8080
    echo.
) else (
    echo [SUCCESS] 端口 8080 未被占用
)

echo.

:: 检查Docker容器状态
echo [4] 检查现有Docker容器
echo ----------------------------------------
docker ps -a --filter "name=iot_bicycle"
echo.

:: 检查Docker镜像
echo [5] 检查Docker镜像
echo ----------------------------------------
docker images | findstr postgres
docker images | findstr pgadmin
echo.

:: 检查磁盘空间
echo [6] 检查磁盘空间
echo ----------------------------------------
for /f "tokens=3" %%a in ('dir "%~dp0" /-c ^| findstr /i "bytes free"') do (
    echo 可用磁盘空间: %%a bytes
)
echo.

:: 尝试拉取PostgreSQL镜像
echo [7] 测试镜像拉取
echo ----------------------------------------
echo [INFO] 尝试拉取PostgreSQL镜像...
docker pull postgres:15
if errorlevel 1 (
    echo [ERROR] 无法拉取PostgreSQL镜像
    echo [可能原因] 网络连接问题或Docker Hub访问受限
    echo [解决方案] 检查网络连接或使用国内镜像源
    goto :error_exit
) else (
    echo [SUCCESS] PostgreSQL镜像拉取成功
)

echo.

:: 检查配置文件
echo [8] 检查配置文件
echo ----------------------------------------
if exist "%~dp0docker-compose.yml" (
    echo [SUCCESS] docker-compose.yml 文件存在
) else (
    echo [ERROR] docker-compose.yml 文件不存在
    goto :error_exit
)

if exist "%~dp0init_database_postgresql.sql" (
    echo [SUCCESS] 数据库初始化脚本存在
) else (
    echo [ERROR] init_database_postgresql.sql 文件不存在
    goto :error_exit
)

if exist "%~dp0postgresql.conf" (
    echo [SUCCESS] PostgreSQL配置文件存在
) else (
    echo [ERROR] postgresql.conf 文件不存在
    goto :error_exit
)

echo.

:: 测试Docker Compose配置
echo [9] 验证Docker Compose配置
echo ----------------------------------------
docker-compose config
if errorlevel 1 (
    echo [ERROR] Docker Compose 配置文件有语法错误
    goto :error_exit
) else (
    echo [SUCCESS] Docker Compose 配置文件语法正确
)

echo.

:: 清理之前的容器和数据卷
echo [10] 清理环境
echo ----------------------------------------
echo [INFO] 停止并删除现有容器...
docker-compose down -v
echo [SUCCESS] 环境清理完成

echo.

:: 尝试启动服务
echo [11] 尝试启动PostgreSQL服务
echo ----------------------------------------
echo [INFO] 启动PostgreSQL服务...
docker-compose up -d postgres
if errorlevel 1 (
    echo [ERROR] PostgreSQL 启动失败
    echo [INFO] 查看详细错误日志:
    docker-compose logs postgres
    goto :error_exit
) else (
    echo [SUCCESS] PostgreSQL 服务启动成功
)

:: 等待PostgreSQL启动
echo [INFO] 等待PostgreSQL完全启动...
set /a counter=0
:wait_loop
docker-compose exec -T postgres pg_isready -h localhost -p 5432 >nul 2>&1
if errorlevel 1 (
    set /a counter+=1
    if !counter! GTR 30 (
        echo [ERROR] PostgreSQL 启动超时
        echo [INFO] 查看PostgreSQL日志:
        docker-compose logs postgres
        goto :error_exit
    )
    timeout /t 2 /nobreak >nul
    echo 等待中... [!counter!/30]
    goto :wait_loop
)

echo [SUCCESS] PostgreSQL 已就绪！

:: 测试数据库连接
echo [12] 测试数据库连接
echo ----------------------------------------
docker-compose exec -T postgres psql -h localhost -U bicycle_user -d bicycle -c "SELECT version();"
if errorlevel 1 (
    echo [ERROR] 数据库连接失败
    docker-compose logs postgres
    goto :error_exit
) else (
    echo [SUCCESS] 数据库连接成功！
)

echo.
echo ========================================
echo [SUCCESS] PostgreSQL 部署诊断完成！
echo ========================================
echo.
echo [INFO] 所有检查都已通过，PostgreSQL已成功部署
echo [INFO] 数据库连接信息:
echo   - 主机: localhost
echo   - 端口: 5432
echo   - 数据库: bicycle
echo   - 用户名: bicycle_user
echo   - 密码: bicycle123
echo.
echo 按任意键退出...
pause >nul
exit /b 0

:error_exit
echo.
echo ========================================
echo [ERROR] 发现问题，请按照上述解决方案进行修复
echo ========================================
echo.
echo [常见解决方案总结]
echo 1. 确保Docker Desktop已安装并正在运行
echo 2. 检查防火墙是否阻止了Docker端口
echo 3. 确保系统有足够的磁盘空间
echo 4. 检查是否有其他程序占用了5432端口
echo 5. 尝试重启Docker Desktop
echo 6. 如果使用VPN，尝试断开VPN后重试
echo.
echo 按任意键退出...
pause >nul
exit /b 1 